{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook is our introduction to the concept of [eigenvalues and eigenvectors](https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors) in 18.06.  Unlike the textbook, however, I'm going to approach the subject a little differently.  I'm going to work *backwards*: starting at what we would *like* to obtain (**make matrices act like scalars**) and go backwards to the methods and conditions to achieve this."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Scalars are easy, matrices are hard?\n",
    "\n",
    "Multiplying a vector by a scalar is easy to understand.  For example, if we multiply a vector $x$ by 0.1 over and over again, we get\n",
    "\n",
    "$$\n",
    "0.1^n x \\to 0\n",
    "$$\n",
    "\n",
    "The direction remains the same, but the magnitude decreases by a factor of 10 each time we multiply, asympotically going to zero.\n",
    "\n",
    "In contrast, multiplying by a *matrix* is a complicated operation.  Easy for a computer, but hard to *understand* if the matrix is big.  If we multiply a vector $x$ by a matrix $A$ over and over, what happens?\n",
    "\n",
    "$$\n",
    "A^n x \\to ???\n",
    "$$\n",
    "\n",
    "Hard to say at a glance, even if I tell you what $A$ is!\n",
    "\n",
    "Also, lots of things that are easy with scalars $\\lambda$ are hard with matrices $A$. For example:\n",
    "\n",
    "* **Solving** $\\lambda x = b$ is easy: $x = \\lambda^{-1} b$ (unless $\\lambda=0$).  Solving $Ax=b$ is hard; even if $A$ is nonsingular, $A^{-1} b$ is a lot of work to compute.  Inverting matrices is harder than inverting numbers!\n",
    "\n",
    "* It's easy to tell **whether** $\\lambda x = b$ **has a solution**, and whether it is unique: unique solutions if $\\alpha \\ne 0$, and otherwise if $\\lambda=0$ then there are (infinitely many) solutions only for $b=0$.  For $Ax=b$, we need to work out the rank, nullspace, etcetera.\n",
    "\n",
    "* Repeated multiplication (**powers**): $\\lambda^n$ is easy to compute and understand, $A^n$ is hard.\n",
    "\n",
    "  - $\\lambda^n$ will go to zero as $n \\to \\infty$ if $|\\lambda| < 1$, and will blow up if $|\\lambda| > 1$.  What about $A^n$?\n",
    "\n",
    "* Solving the **ordinary differential equation (ODE)** $\\frac{dx}{dt} = \\lambda x$ is easy: $x(t) = e^{\\lambda t} x(0)$.  Solving the *system* of ODEs $\\frac{dx}{dt} = A x$ seems hard.  Maybe $x(t) = e^{A t} x(0)$, but what the heck does $e^A$ even mean?\n",
    "\n",
    "  - The solutions $\\sim e^{\\lambda t}$ will go to zero as $t \\to \\infty$ for real $\\lambda < 0$ and will blow up for $\\lambda > 0$.  What about for $A$?\n",
    "\n",
    "* ...many other tasks..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Eigenvectors: Where matrices act like scalars\n",
    "\n",
    "Suppose that we could find *some* $x \\ne 0$ for which\n",
    "\n",
    "$$\n",
    "\\boxed{Ax = \\lambda x}\n",
    "$$\n",
    "\n",
    "for some scalar λ.   **For *that* x, the matrix A would act like a scalar λ.**  Multipling, dividing, etcetera by $A$ would be easy for that vector (and multiples thereof)!\n",
    "\n",
    "We call such an $x$ an **eigenvector** of $A$, and $\\lambda$ the corresponding **eigenvalue**.  Of course, $\\alpha x$ for any scalar $\\alpha$ is an eigenvector of the same $\\lambda$, but this is a *subspace*, and we only need to find a *basis* vector $x$.\n",
    "\n",
    "But why should such magical solutions even exist?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Diagonal matrices are almost as easy as scalars\n",
    "\n",
    "If we have an $m \\times m$ [diagonal matrix](https://en.wikipedia.org/wiki/Diagonal_matrix) $Λ$, it is almost as easy to work with as a scalar:\n",
    "\n",
    "$$\n",
    "Λ = \\begin{pmatrix} \\lambda_1 & 0 & 0 & 0 \\\\\n",
    "                    0 & \\lambda_2 & 0 & 0 \\\\\n",
    "                    0 & 0 & \\ddots & 0 \\\\\n",
    "                    0 & 0 & 0 & \\lambda_m \\end{pmatrix}\n",
    "$$\n",
    "\n",
    "In fact, it is clear that the diagonal elements $\\lambda_k$ are exactly eigenvalues, and the corresponding eigenvectors are the [standard basis vectors](https://en.wikipedia.org/wiki/Standard_basis): the columns of the $m \\times m$ identity matrix $I$.\n",
    "\n",
    "For example, consider the $4\\times4$ matrix with $\\lambda_1 = 0.1$, $\\lambda_2 = 0.2$, $\\lambda_3 = 0.3$, and $\\lambda_4$ = 0.4:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4×4 Array{Float64,2}:\n",
       " 0.1  0.0  0.0  0.0\n",
       " 0.0  0.2  0.0  0.0\n",
       " 0.0  0.0  0.4  0.0\n",
       " 0.0  0.0  0.0  0.5"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Λ = diagm([0.1, 0.2, 0.4, 0.5])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This has four eigenvectors\n",
    "$$\n",
    "\\begin{pmatrix} 1 \\\\ 0 \\\\ 0 \\\\ 0 \\end{pmatrix}, \n",
    "\\begin{pmatrix} 0 \\\\ 1 \\\\ 0 \\\\ 0 \\end{pmatrix}, \n",
    "\\begin{pmatrix} 0 \\\\ 0 \\\\ 1 \\\\ 0 \\end{pmatrix}, \n",
    "\\begin{pmatrix} 0 \\\\ 0 \\\\ 0 \\\\ 1 \\end{pmatrix}, \n",
    "$$\n",
    "(along with any multiples of these vectors: again, we only need a basis for the eigenvectors)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       " 1.0\n",
       " 0.0\n",
       " 0.0\n",
       " 0.0"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Λ * [10\n",
    "     0\n",
    "     0\n",
    "     0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       " 0.0\n",
       " 2.0\n",
       " 0.0\n",
       " 0.0"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Λ * [0\n",
    "     10\n",
    "     0\n",
    "     0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we multiply a vector $x \\in \\mathbb{R}^4$ by $Λ$, then it multiplies the first component by 0.1, the second by 0.2, etcetera:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       " 0.1\n",
       " 0.2\n",
       " 0.4\n",
       " 0.5"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = [1,1,1,1]\n",
    "Λ * x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Multiplying 10 times by $Λ$ just multiplies the first component by $0.1^{10}$, the second by $0.2^{10}$, and so on:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       " 1.0e-10    \n",
       " 1.024e-7   \n",
       " 0.000104858\n",
       " 0.000976563"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Λ^10 * x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can think about this as writing $x$ in the *basis* of the eigenvectors, and then for *each* eigenvector, the matrix Λ acts like a number λ:\n",
    "\n",
    "$$\n",
    "\\Lambda^n x = \\lambda_1^n \\begin{pmatrix} 1 \\\\ 0 \\\\ 0 \\\\ 0 \\end{pmatrix} +\n",
    "\\lambda_2^n \\begin{pmatrix} 0 \\\\ 1 \\\\ 0 \\\\ 0 \\end{pmatrix} +\n",
    "\\lambda_3^n \\begin{pmatrix} 0 \\\\ 0 \\\\ 1 \\\\ 0 \\end{pmatrix} +\n",
    "\\lambda_4^n \\begin{pmatrix} 0 \\\\ 0 \\\\ 0 \\\\ 1 \\end{pmatrix} \\; .\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since each $|\\lambda_k| < 1$, it is clear that $\\Lambda^n x \\to 0$ as $n \\to \\infty$.\n",
    "\n",
    "Equivalently, the matrix $$ Λ^n = \\begin{pmatrix} \\lambda_1^n & & & \\\\ & \\lambda_2^n & & \\\\ & & \\lambda_3^n & \\\\ & & & \\lambda_4^n \\end{pmatrix}$$ itself must go to zero as $n$ increases:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4×4 Array{Float64,2}:\n",
       " 1.0e-100  0.0          0.0          0.0        \n",
       " 0.0       1.26765e-70  0.0          0.0        \n",
       " 0.0       0.0          1.60694e-40  0.0        \n",
       " 0.0       0.0          0.0          7.88861e-31"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Λ^100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Morever, if we multiply $Λ$ by a vector $x$ repeatedly, it will quickly become **nearly parallel** to the last eigenvector $(0,0,0,1)$, since the $0.5^n$ term **decays the most slowly**.  It is expecially easy to see this if we look at the **unit vector** (length = 1)\n",
    "\n",
    "$$\n",
    "\\frac{Λ^n x}{\\Vert Λ^n x \\Vert}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div id=\"interact-js-shim\">\n",
       "    <script charset=\"utf-8\">\n",
       "(function (IPython, $, _, MathJax) {\n",
       "    $.event.special.destroyed = {\n",
       "\tremove: function(o) {\n",
       "\t    if (o.handler) {\n",
       "\t\to.handler.apply(this, arguments)\n",
       "\t    }\n",
       "\t}\n",
       "    }\n",
       "\n",
       "    var OutputArea = IPython.version >= \"4.0.0\" ? require(\"notebook/js/outputarea\").OutputArea : IPython.OutputArea;\n",
       "\n",
       "    var redrawValue = function (container, type, val) {\n",
       "\tvar selector = $(\"<div/>\");\n",
       "\tvar oa = new OutputArea(_.extend(selector, {\n",
       "\t    selector: selector,\n",
       "\t    prompt_area: true,\n",
       "\t    events: IPython.events,\n",
       "\t    keyboard_manager: IPython.keyboard_manager\n",
       "\t})); // Hack to work with IPython 2.1.0\n",
       "\n",
       "\tswitch (type) {\n",
       "\tcase \"image/png\":\n",
       "            var _src = 'data:' + type + ';base64,' + val;\n",
       "\t    $(container).find(\"img\").attr('src', _src);\n",
       "\t    break;\n",
       "\tcase \"text/latex\":\n",
       "\t\tif (MathJax){\n",
       "\t\t\tvar math = MathJax.Hub.getAllJax(container)[0];\n",
       "\t\t\tMathJax.Hub.Queue([\"Text\", math, val.replace(/^\\${1,2}|\\${1,2}$/g, '')]);\n",
       "\t\t\tbreak;\n",
       "\t\t}\n",
       "\tdefault:\n",
       "\t    var toinsert = OutputArea.append_map[type].apply(\n",
       "\t\toa, [val, {}, selector]\n",
       "\t    );\n",
       "\t    $(container).empty().append(toinsert.contents());\n",
       "\t    selector.remove();\n",
       "\t}\n",
       "    }\n",
       "\n",
       "\n",
       "    $(document).ready(function() {\n",
       "\tfunction initComm(evt, data) {\n",
       "\t    var comm_manager = data.kernel.comm_manager;\n",
       "        //_.extend(comm_manager.targets, require(\"widgets/js/widget\"))\n",
       "\t    comm_manager.register_target(\"Signal\", function (comm) {\n",
       "            comm.on_msg(function (msg) {\n",
       "                var val = msg.content.data.value;\n",
       "                $(\".signal-\" + comm.comm_id).each(function() {\n",
       "                var type = $(this).data(\"type\");\n",
       "                if (typeof(val[type]) !== \"undefined\" && val[type] !== null) {\n",
       "                    redrawValue(this, type, val[type], type);\n",
       "                }\n",
       "                });\n",
       "                delete val;\n",
       "                delete msg.content.data.value;\n",
       "            });\n",
       "\t    });\n",
       "\n",
       "\t    // coordingate with Comm and redraw Signals\n",
       "\t    // XXX: Test using Reactive here to improve performance\n",
       "\t    $([IPython.events]).on(\n",
       "\t\t'output_appended.OutputArea', function (event, type, value, md, toinsert) {\n",
       "\t\t    if (md && md.reactive) {\n",
       "                // console.log(md.comm_id);\n",
       "                toinsert.addClass(\"signal-\" + md.comm_id);\n",
       "                toinsert.data(\"type\", type);\n",
       "                // Signal back indicating the mimetype required\n",
       "                var comm_manager = IPython.notebook.kernel.comm_manager;\n",
       "                var comm = comm_manager.comms[md.comm_id];\n",
       "                comm.then(function (c) {\n",
       "                    c.send({action: \"subscribe_mime\",\n",
       "                       mime: type});\n",
       "                    toinsert.bind(\"destroyed\", function() {\n",
       "                        c.send({action: \"unsubscribe_mime\",\n",
       "                               mime: type});\n",
       "                    });\n",
       "                })\n",
       "\t\t    }\n",
       "\t    });\n",
       "\t}\n",
       "\n",
       "\ttry {\n",
       "\t    // try to initialize right away. otherwise, wait on the status_started event.\n",
       "\t    initComm(undefined, IPython.notebook);\n",
       "\t} catch (e) {\n",
       "\t    $([IPython.events]).on('kernel_created.Kernel kernel_created.Session', initComm);\n",
       "\t}\n",
       "    });\n",
       "})(IPython, jQuery, _, MathJax);\n",
       "</script>\n",
       "    <script>\n",
       "        window.interactLoadedFlag = true\n",
       "       $(\"#interact-js-shim\").bind(\"destroyed\", function () {\n",
       "           if (window.interactLoadedFlag) {\n",
       "               console.warn(\"JavaScript required by Interact will be removed if you remove this cell or run using Interact more than once.\")\n",
       "           }\n",
       "       })\n",
       "       $([IPython.events]).on(\"kernel_starting.Kernel kernel_restarting.Kernel\", function () { window.interactLoadedFlag = false })\n",
       "   </script>\n",
       "</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "Interact.Slider{Int64}(Signal{Int64}(0, nactions=1),\"\",0,0:100,\"horizontal\",true,\"d\",true)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       " 0.5\n",
       " 0.5\n",
       " 0.5\n",
       " 0.5"
      ]
     },
     "execution_count": 7,
     "metadata": {
      "comm_id": "f6bae2c8-2def-4780-a558-1078a9329e74",
      "reactive": true
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "using Interact\n",
    "@manipulate for n = slider(0:100, value=0)\n",
    "    y = Λ^n * x\n",
    "    y / norm(y)\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A diagonal matrix is **nonsingular** if the **diagonal entries are nonzero**, and the inverse $Λ^{-1}$ is found by just inverting the diagonal entries:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4×4 Array{Float64,2}:\n",
       " 10.0  0.0  0.0  0.0\n",
       "  0.0  5.0  0.0  0.0\n",
       "  0.0  0.0  2.5  0.0\n",
       "  0.0  0.0  0.0  2.0"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inv(Λ)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**If all matrices were diagonal**, linear algebra would be a lot easier!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Diagonal + Change of Basis is Almost as Easy\n",
    "\n",
    "Suppose we have an invertible $m \\times m$ matrix $X$.   Going from $x$ to $Xc = x$, or $c = X^{-1}x$, is just a **change of basis**: we are writing $x$ in the basis of the **columns of X**, and $y$ are the coefficients.\n",
    "\n",
    "If $X = \\begin{pmatrix} x_1 & x_2 & \\cdots & x_m \\end{pmatrix}$, where the $x_k$ are the columns, then $x=Xc$ is with $c = (c_1,c_2,\\ldots,c_m)$ is equivalent to:\n",
    "\n",
    "$$\n",
    "x = Xc = c_1 x_1 + c_2 x_2 + \\cdots c_m x_m \\; .\n",
    "$$\n",
    "\n",
    "Consider the matrix $A = X Λ X^{-1}$, where $Λ$ is diagonal as above.  What does $Ax$ mean?  If we write:\n",
    "\n",
    "$$\n",
    "Ax = X \\underbrace{ Λ \\underbrace{X^{-1} x}_c }_{Λc}\n",
    "$$\n",
    "\n",
    "we see that $Ax$ is equivalent to:\n",
    "\n",
    "1. Solve $Xc=x$ to express $x$ in the $X$ basis with coefficients $c$.\n",
    "\n",
    "2. Multiply each component of $c$ by the corresponding diagonal entry of $Λ$ to get $Λc$.\n",
    "\n",
    "3. Multiply $Λc$ by $X$ to get $X(Λc)$ in the original ($x$) coordinate system (basis).\n",
    "\n",
    "That is $A$ is just a **diagonal matrix in a different basis**: we change basis, multiply the components by scalars, then change back the basis.\n",
    "\n",
    "Hence\n",
    "\n",
    "$$\n",
    "Ax = AXc = X Λ c = \\lambda_1 c_1 x_1 + \\lambda_2 c_2 x_2 + \\cdots \\lambda_m c_m x_m \\; .\n",
    "$$\n",
    "\n",
    "Another way of putting this is that the **columns of X are eigenvectors**:\n",
    "\n",
    "$$\n",
    "A x_k = \\lambda_k x_k\n",
    "$$\n",
    "\n",
    "for $k = 1, \\ldots, m$!\n",
    "\n",
    "That is, $A$ just **multiplies each eigenvector $x_k$ by the corresponding eigenvalue $\\lambda_k$**.  Again, **for each eigenvector, the matrix A just acts like a number λ**.\n",
    "\n",
    "For example, with our $4 \\times 4$ matrix $Λ$ from above, let's construct:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = [ 1 0 1  0\n",
    "      2 1 0  1\n",
    "      0 1 1  0\n",
    "      1 0 0 -1]\n",
    "rank(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4×4 Array{Float64,2}:\n",
       "  0.325  -0.075   0.075  -0.075\n",
       "  0.025   0.225  -0.025  -0.275\n",
       "  0.15   -0.05    0.25   -0.05 \n",
       " -0.1    -0.1     0.1     0.4  "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = X * Λ / X"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we didn't know where it came from, this matrix $A$ wouldn't look like anything special.\n",
    "\n",
    "But multiplying $A$ by **any column of X** just multiplies by a number.  For example, multipling $A$ by the *first column* of X just multiplies by $0.1$ (the first diagonal element of $Λ$):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       " 0.1\n",
       " 0.2\n",
       " 0.0\n",
       " 0.1"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A * X[:, 1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Multiplying $A$ by the second column just multiplies it by 0.2, and so on:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       " 0.0\n",
       " 0.2\n",
       " 0.2\n",
       " 0.0"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A * X[:, 2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**For these special vectors** (the columns of $X$), which we will call **eigenvectors**, the **matrix A acts just like a scalar** (which we call the **eigenvalue**).\n",
    "\n",
    "If we solve $Xc = x$ to write\n",
    "\n",
    "$$\n",
    "x = c_1 x_1 + c_2 x_2 + c_3 x_3 + c_4 x_4\n",
    "$$\n",
    "\n",
    "then $Ax$ is just\n",
    "\n",
    "$$\n",
    "x = 0.1 c_1 x_1 + 0.2 c_2 x_2 + 0.4 c_3 x_3 + 0.5 c_4 x_4\n",
    "$$\n",
    "\n",
    "It is clear, therefore, that multipling *any* vector $x$ repeatedly by $A$ will make it go to zero (the length will shrink exponentially fast).  Let's try our vector $x = (1,1,1,1)$ from above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Int64,1}:\n",
       " 1\n",
       " 1\n",
       " 1\n",
       " 1"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we solve $Xc=x$ to express it in the $X$ basis, then we see that it has components from every column of $X$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       "  0.5\n",
       "  0.5\n",
       "  0.5\n",
       " -0.5"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = X\\x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we multiply $A$ times $x$ many times, it must **go to zero** for the same reason as $Λ^n x$ above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       "  8.03468e-41\n",
       " -3.9443e-31 \n",
       "  8.03468e-41\n",
       "  3.9443e-31 "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A^100 * x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       "  1.4404e-10\n",
       " -0.707107  \n",
       "  1.4404e-10\n",
       "  0.707107  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(A^100*x) / norm(A^100*x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since this must happen for *any* $x$, $A^n$ itself must go to zero:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4×4 Array{Float64,2}:\n",
       "  1.2052e-40   -4.01734e-41   4.01734e-41  -4.01736e-41\n",
       "  1.97215e-31   1.97215e-31  -1.97215e-31  -5.91646e-31\n",
       "  1.2052e-40   -4.01734e-41   4.01734e-41  -4.01735e-41\n",
       " -1.97215e-31  -1.97215e-31   1.97215e-31   5.91646e-31"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A^100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Another way to see this is to realize that:\n",
    "\n",
    "$$\n",
    "A^n = \\underbrace{AAA \\cdots  AAA}_{n\\mbox{ times}} = XΛX^{-1}XΛX^{-1}XΛX^{-1}\\cdots XΛX^{-1}XΛX^{-1}XΛX^{-1} = XΛ^n X^{-1}\n",
    "$$\n",
    "\n",
    "which goes to zero because $Λ^n$ goes to zero.\n",
    "\n",
    "The formula means that\n",
    "\n",
    "$$\n",
    "A^n x = XΛ^n \\underbrace{X^{-1}x}_c = \\lambda_1^n c_1 x_1 + \\lambda_2^n c_2 x_2 + \\cdots + \\lambda_m^n c_m x_m\n",
    "$$\n",
    "\n",
    "i.e. **multiplying repeatedly by A just multiplies each eigenvector repeatedly by $\\lambda$.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, since $\\Lambda$ is invertible, $A$ must be invertible too: $$A^{-1} x = c_1 x_1 / \\lambda_1 + c_2 x_2 / \\lambda_2 + \\cdots $$\n",
    "i.e. $A^{-1} x$ just divides each eigenvector component by the eigenvalue."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4×4 Array{Float64,2}:\n",
       "  4.375  1.875  -1.875  1.875\n",
       "  1.75   6.75   -1.75   4.75 \n",
       " -1.875  0.625   4.375  0.625\n",
       "  2.0    2.0    -2.0    4.0  "
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inv(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Equivalently $A^{-1} = X \\Lambda^{-1} X^{-1}$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4×4 Array{Float64,2}:\n",
       "  4.375  1.875  -1.875  1.875\n",
       "  1.75   6.75   -1.75   4.75 \n",
       " -1.875  0.625   4.375  0.625\n",
       "  2.0    2.0    -2.0    4.0  "
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X * inv(Λ) * inv(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice that the entries are not too big, which is not surprising since the $1/\\lambda_1 = 10$ is the biggest entry in $\\Lambda^{-1}$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Eigenvectors of an arbitrary matrix\n",
    "\n",
    "By constructing $A = X \\Lambda X^{-1}$ above, we got rather arbitrary-looking $m\\times m$ matrices $A$ with $m$ linearly eigenvectors.   This was great, because then the eigenvectors formed a basis of $\\mathbb{R}^m$:  we could **write any vector in the basis of eigenvectors**, and for each eigenvector component the **matrix acts like a scalar**.\n",
    "\n",
    "Can we do the reverse?  For *any* matrix $A$, can we find a basis $X$ of eigenvectors, such that $A = X \\Lambda X^{-1}$ in that basis?  (This is called **diagonalizing** the matrix: finding a basis in which it is diagonal.)  *If* we can find the eigenvectors for an arbitrary $A$, they would tell us a lot — matrices are hard to understand, but scalars are easy, and the eigenvalues tell us what scalars $A$ acts like.\n",
    "\n",
    "It turns out that **this this is almost always possible**.  For *almost* any $m \\times m$ matrix $A$ we (or rather, the computer) can find a basis of exactly $m$ eigenvectors $x_k$ and eigenvalues $\\lambda_k$.  Julia will do this for us, with the `eig(A)` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([0.1,0.2,0.4,0.5],\n",
       "[0.408248 -7.70519e-16 0.707107 2.71948e-16; 0.816497 -0.707107 0.0 -0.707107; 8.04912e-16 -0.707107 0.707107 1.22377e-15; 0.408248 -4.98571e-16 -3.31016e-16 0.707107])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eigenvalues, eigenvectors = eig(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It returns exactly the same eigenvalues as above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       " 0.1\n",
       " 0.2\n",
       " 0.4\n",
       " 0.5"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eigenvalues"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It also returns a matrix whose columns are eigenvectors.  These look a little different than $X$ from above, though:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4×4 Array{Float64,2}:\n",
       " 0.408248     -7.70519e-16   0.707107      2.71948e-16\n",
       " 0.816497     -0.707107      0.0          -0.707107   \n",
       " 8.04912e-16  -0.707107      0.707107      1.22377e-15\n",
       " 0.408248     -4.98571e-16  -3.31016e-16   0.707107   "
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eigenvectors"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "But they are just scalar multiples of the columns of $X$, as we can easily see by multiplying by $X^{-1}$ (writing these eigenvectors in the $X$ basis:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4×4 Array{Float64,2}:\n",
       "  0.40825  -0.0       0.0      -0.0    \n",
       "  0.0      -0.70711  -0.0       0.0    \n",
       "  0.0      -0.0       0.70711   0.0    \n",
       " -0.0      -0.0       0.0      -0.70711"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "round.(X \\ eigenvectors, 5) # X⁻¹ * eigenvectors, rounded to 5 digits"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are **extremely rare exceptions** called [defective matrices](https://en.wikipedia.org/wiki/Defective_matrix) in which you get **too few** eigenvectors to form a basis for the whole $\\mathbb{R}^m$ space. We'll come back to those later, but for now I want to focus on the typical cases of [diagonalizable matrices](https://en.wikipedia.org/wiki/Diagonalizable_matrix) where we *do* have $m$ eigenvectors.\n",
    "\n",
    "Given only $A$, how do we find the eigenvectors and eigenvalues?  How do we know that such solutions exist in the first place, and how many such solutions are there?\n",
    "\n",
    "Let's go back to the beginning.  We are trying to find $x\\ne 0$ satisfying $Ax = \\lambda x$.  Equivalently, we want:\n",
    "\n",
    "$$\n",
    "Ax - \\lambda x = (A - \\lambda I) x = 0\n",
    "$$\n",
    "\n",
    "That is, we want the **nullspace** of $A - \\lambda I$.   For *most* λ, this nullspace will be just $\\{0\\}$.   To get a nontrivial nullspace, we want to\n",
    "\n",
    "* **Find the values of λ such that A-λI is singular.**\n",
    "\n",
    "These λ are the eigenvalues of $A$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# The characteristic polynomial\n",
    "\n",
    "Finding the $\\lambda$ such that $A - \\lambda I$ is singular can be theoretically expressed in terms of a concept you will have heard of before: a matrix is singular when its [determinant](https://en.wikipedia.org/wiki/Determinant) is zero.  Hence, we want to solve:\n",
    "\n",
    "$$\n",
    "p(\\lambda) = \\det(A - \\lambda I) = 0\n",
    "$$\n",
    "\n",
    "This function $p(\\lambda)$ turns out to be a **polynomial of degree m** for an $m\\times m$ matrix $A$, and is called the [characteristic polynomial](https://en.wikipedia.org/wiki/Characteristic_polynomial) of $A$.  Since it is a degree-m polynomial, it will typically have **m roots** (possibly **complex numbers**), the eigenvalues of $A$!\n",
    "\n",
    "To understand this properly, we need to go back and explain determinants.  All you will have seen determinants of 2×2 and 3×3 matrices before (e.g. in 18.02), but you may not have seen them for general $m\\times m$ matrices.\n",
    "\n",
    "Let's plot $p(\\lambda)$ for our 4×4 matrix $A = X\\Lambda X^{-1}$ from above, using Julia's built-in `det` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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S4iKisLEiRNx8+bN6qiNakLbtoBeD2RnA6mpaldDRERawOBUccOHD8epU6dQt25dtG/fHgaDAUVFRdasjWpC7dpy8jKg+AwJIiKisuTkyOucAgxOFeXu7o45c+bg0KFDeOaZZ/Dkk0/in//8p2Nc682ecJwTERFZ6tdf5XXqGjWS1z11MFaZxyk4OBibNm3CV199hRUrViA4ONgam6WawjPriIjIUsq+Qtl3OJhKz+NkzsCBA3H8+HEsXrzYmpul6sYjTkREZCkHHt8EVPCI02Vlsqty1KpVC1OnTgUAXLt2rXJVUc3q1ElOhpmeDvB3RkRE5XHQGcMVFQpO3bp1w7hx43DkyJEy22RlZeGzzz5Dhw4dsGHDhioXSDXA3b14gHg5v1siInJweXlyjBMAhIerW4tKKtRVl5ycjL///e8YMGAAXF1dERYWhqZNm8LV1RV37txBcnIyTp06hS5duuDDDz/E008/XV11k7WFh8s/hsOHgehotashIiJblJQEFBbKgeEOOuF1hY441a9fHx999BFu3LiBxYsXIyQkBLdu3cK5c+cAAC+//DKOHTuG+Ph4hiatUT45HD6sbh1ERGS7lH1EeDig06lbi0oqNTjczc0N4eHheOGFF+DkZJq9hBC4fPkymjdvbpUCqYYowenIETmDuJNVTrgkIiJ7UjI4OahK7x2DgoJw69atUut///13BAUFVakoUkH79oCbm5xBnJfSISIicxicKh+chBBm19+7dw+urq6VLohUUqsWEBYml9ldR0RED/v9d+D8ebnctau6taiowl11sbGxAACdTof33nsP7u7uxu8VFRXh0KFDCA0NtV6FVHPCw4H9+4FDh4CYGLWrISIiW6J8qA4JAerVU7cWFVU4OCX+b+IrIQROnDgBFxcX4/dcXFzQuXNnvPXWW9arkGoOB4gTEVFZ2E0HoBLBaffu3QCAkSNHYuHChfDy8rJ6UaQS5Y/h+HHg/n2AXa5ERKRgcAJQhTFOK1asYGiyN4GBQIMGwIMHMjwREREB8qK+DE4AqniR33379uGVV15Bjx49jJdX+fLLL7F//36rFEc1TKdjdx0REZV26RKQkSFPJHLwccyVDk4bNmxAVFQU3NzckJiYiPz8fADykisffPCB1QqkGsbgRERED1P2CZ07O/wwjkoHpzlz5mDZsmX47LPPULt2beP6Xr16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",
      "text/plain": [
       "PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x31f7e9fd0>)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "PyObject <matplotlib.text.Text object at 0x31f97b090>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "using PyPlot\n",
    "λ = linspace(0,0.6,100)\n",
    "plot(λ, [det(A - λ*I) for λ in λ], \"r-\")\n",
    "plot(λ, 0*λ, \"k--\")\n",
    "plot(diag(Λ),diag(Λ)*0, \"bo\")\n",
    "xlabel(L\"\\lambda\")\n",
    "ylabel(L\"\\det(A - \\lambda I)\")\n",
    "title(\"characteristic polynomial\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is a quartic curve, and exactly as expected there are roots (dots) at the four eigenvalues 0.1, 0.2, 0.4, and 0.5."
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Julia 0.5.0",
   "language": "julia",
   "name": "julia-0.5"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "0.5.0"
  },
  "widgets": {
   "state": {
    "cd74e018-1c94-453a-b174-ea9beb9bca31": {
     "views": [
      {
       "cell_index": 16
      }
     ]
    }
   },
   "version": "1.2.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
